#define _GNU_SOURCE
#include  "daemon_runner.h"
#include  "unistd.h"
#include <fcntl.h>
#include <signal.h>
#include  "daemon_sub_process.h"
#include  "log.h"


static int is_running=1;
static sub_process_t *sub_process_list[SUB_PROCESS_COUNT];
void daemon_runner_stop(int signo)
{
   is_running=0;
}


/**
 * 运行守护进程
 * 1  设定为守护进程  变为后台进程 
 * 2  设定日志信息的输出 
 * 3  注册停止信号  kill
 * 4  初始化子进程  app  ota
 * 5  周期  检测或启动子进程
 * 6  如果退出循环 逐个结束子进程
 * 
 */
int daemon_runner_run()
{
    //  1  设定为守护进程  变为后台进程 
    daemon(0,1);
    //  2  设定日志信息的输出 
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    open("/dev/null", O_RDWR);
    open(LOG_FILE, O_CREAT | O_RDWR, 0644); //标准初始重定性
    open(LOG_FILE, O_CREAT | O_RDWR, 0644);// 标准错误重定向
    // 3  注册停止信号  kill
    signal(SIGTERM, daemon_runner_stop);
    //4  初始化子进程  app  ota
    log_info("开始初始化子进程"); 
    sub_process_t *app_process=  daemon_sub_process_init("app");
    sub_process_t *ota_process=  daemon_sub_process_init("ota");

    sub_process_list[0]=app_process;
    sub_process_list[1]=ota_process;

    //5  周期  检测或启动子进程
    log_info("检查子进程"); 
    while(is_running)
    {   
        for (size_t i = 0; i < SUB_PROCESS_COUNT; i++)
        {
             daemon_sub_process_check_and_start(sub_process_list[i]);
        }
        sleep(2);   
    }
    //6  如果退出循环 逐个结束子进程
    for (size_t i = 0; i < SUB_PROCESS_COUNT; i++)
    {
        daemon_sub_process_stop(sub_process_list[i]);
    }
    return 0;

}